/* eslint-disable object-curly-newline */
import React, { Component } from 'react';
import { message } from 'antd';
import * as config from '../../../utils/config';
import * as utils from '../../../utils/utils';
import * as comFunc from '../../Common/ComFunc';
import * as commonServices from '../../../services/services';

export default (ChildComponent) => {
  return class getDataHigher extends Component {
    /**   构造函数   */
    constructor(props) {
      super(props);
      this.state = {
        ...props,
        masterData: {}, /*   主表数据   */
        slaveData: [], /*   从表数据   */
        dataTotal: {}, /*   合计字段   */
        checkData: [], /*   审核表数据   */
        masterFlag: false, /*   是否获取主表数据   */
        slaveFlag: false, /*   是否获取从表数据   */
        checkFlag: false, /*   是否获取审核表数据   */
        sId: '', /*   数据Id   */
        disabled: false, /*   页面是否可编辑   */
      };
    }

    /**   渲染前只执行一次   */
    componentWillMount() {
    }

    /**   props改变的时候触发   */
    componentWillReceiveProps(nextProps) {
      this.getData(nextProps);
    }

    /**   返回true执行渲染,返回false不渲染   */
    shouldComponentUpdate(nextProps, nextState) {
      const { sId, masterFlag, slaveFlag, checkFlag, copyToData } = nextState;
      const flag = sId !== '' || utils.isNotEmptyObject(copyToData) ? masterFlag && slaveFlag && checkFlag : masterFlag;
      return flag;
    }

    /**   获取数据   */
    getData = (props) => {
      /*   待用数据赋值   */
      const {
        isRender, masterConfig, slaveConfig, checkConfig, sId, masterCopyData, slaveCopyData, configData, copyToData, masterShowConfig,
        slaveColumn, slaveShowConfig, checkColumn, sParentId, sFilterOrderBy, pages, bFilter, currentIndex,
      } = props;
      /*   sId为空时是新增或者复制到,复制到通过判断masterCopyData是否为空对象来区分   */
      if (utils.isNotEmptyStr(sId) || utils.isNotEmptyObject(copyToData)) { /*   非新增(复制到直接数据赋值,非复制到要获取数据)   */
        const obj = {
          isRender,
          masterConfig,
          slaveConfig,
          checkConfig,
          sId,
          masterData: masterCopyData,
          slaveData: slaveCopyData,
          configData,
          copyToData,
          masterShowConfig,
          slaveColumn,
          slaveShowConfig,
          checkColumn,
          sParentId,
          sListFormmasterId: sParentId,
          sFilterOrderBy,
          pages,
          bFilter,
          currentIndex,
        };
        /*   获取所有数据   */
        this.getAllData(obj);
      } else { /*   新增   */
        /*   新增数据时主表数据都填充为默认值   */
        const masterData = comFunc.getDefaultMasterData(masterShowConfig);
        /*   设置state   */
        this.setState({
          ...configData,
          masterConfig,
          masterShowConfig,
          masterData,
          masterFlag: true,
          slaveConfig,
          slaveColumn,
          slaveShowConfig,
          checkConfig,
          checkColumn,
          pageLoading: false,
          sListFormmasterId: sParentId,
          sFilterOrderBy,
          pages,
          bFilter,
          currentIndex,
        });
      }
    }

    /**   获取所有数据   */
    getAllData = (obj) => {
      /*   有些state要重新设置的   */
      this.setState({
        ...obj.configData,
        pageLoading: false,
        copyToData: obj.copyToData,
        masterFlag: false,
        slaveFlag: false,
        checkFlag: false,
        sId: obj.sId,
        disabled: utils.isEmptyObject(obj.copyToData),
        isRender: obj.isRender,
        isChangeHandleTypeUpdate: obj.isChangeHandleTypeUpdate,
        masterConfig: obj.masterConfig,
        masterShowConfig: obj.masterShowConfig,
        slaveConfig: obj.slaveConfig,
        slaveColumn: obj.slaveColumn,
        slaveShowConfig: obj.slaveShowConfig,
        checkConfig: obj.checkConfig,
        checkColumn: obj.checkColumn,
        sListFormmasterId: obj.sListFormmasterId,
        sFilterOrderBy: obj.sFilterOrderBy,
        pages: obj.pages,
        bFilter: obj.bFilter,
        currentIndex: obj.currentIndex,
      });
      /* 获取主表数据 */
      this.getMasterData(obj);
      /* 获取从表数据和合计字段 */
      this.getSlaveData(obj);
      /* 获取审核表数据 */
      this.getCheckData(obj);
    };

    /**   获取主表数据   */
    getMasterData = async (obj) => {
      /*   非新增且主表为空时需要重新获取主表数据.否则用传进来的主表值   */
      if (utils.isEmptyObject(obj.masterData) && utils.isNotEmptyStr(obj.sId)) { /*   需要重新获取数据   */
        /*   待用数据赋值   */
        const { masterConfig, sId } = obj;
        const { token, sModelsId } = this.state;
        const mastersId = masterConfig.sId;
        /*   调用数据接口获取数据   */
        const masterUrl = `${config.server_host}business/getBusinessDataByFormcustomId/${mastersId}?sModelsId=${sModelsId}`;
        const value = { sId, pageSize: '', pageNum: '' };
        const masterReturn = (await commonServices.postValueService(token, value, masterUrl)).data;
        /*   获取数据成功就给state赋值,失败则弹出提示   */
        if (masterReturn.code === 1) { /*   成功   */
          const [masterData] = masterReturn.dataset.rows[0].dataSet;
          this.setState({
            masterData,
            masterFlag: true,
            pageLoading: false,
          });
        } else { /*   失败   */
          message.error(masterReturn.msg);
        }
      } else { /*   不需要重新获取数据   */
        this.setState({
          masterData: obj.masterData,
          masterFlag: true,
          pageLoading: false,
        });
      }
    };

    /**   获取从表数据   */
    getSlaveData = async (obj) => {
      /*   非新增且从表为空时需要重新获取从表数据.否则用传进来的从表值   */
      if (utils.isEmptyArr(obj.slaveData) && utils.isNotEmptyStr(obj.sId)) { /*   需要重新获取数据   */
        /*   待用数据赋值   */
        const { slaveConfig, sId } = obj;
        const { token, sModelsId } = this.state;
        const slavesId = slaveConfig.sId;
        /*   调用数据接口获取数据   */
        const slaveUrl = `${config.server_host}business/getBusinessDataByFormcustomId/${slavesId}?sModelsId=${sModelsId}`;
        const value = { sSqlCondition: { sParentId: sId } };
        const slaveReturn = (await commonServices.postValueService(token, value, slaveUrl)).data;
        /*   获取数据成功就给state赋值,失败则弹出提示   */
        if (slaveReturn.code === 1) { /*   成功   */
          const slaveData = slaveReturn.dataset.rows[0].dataSet;
          const { sumSet } = slaveReturn.dataset.rows[0];
          const dataTotal = sumSet !== undefined ? sumSet[0] : {};
          this.setState({
            slaveData,
            dataTotal,
            slaveFlag: true,
            pageLoading: false,
          });
        } else { /*   失败   */
          message.error(slaveReturn.msg);
        }
      } else { /*   不需要重新获取数据   */
        this.setState({
          slaveData: obj.slaveData,
          dataTotal: obj.dataTotal,
          slaveFlag: true,
          pageLoading: false,
        });
      }
    };

    /**   获取审核表数据   */
    getCheckData = async (obj) => {
      /*   非新增且审核表为空时需要重新获取审核表数据.否则用传进来的从表值   */
      if (utils.isEmptyArr(obj.checkData) && utils.isNotEmptyStr(obj.sId)) { /*   需要重新获取数据   */
        /*   待用数据赋值   */
        const { checkConfig, sId } = obj;
        const { token, sModelsId } = this.state;
        const checksId = checkConfig.sId;
        /*   调用数据接口获取数据   */
        const checkUrl = `${config.server_host}business/getBusinessDataByFormcustomId/${checksId}?sModelsId=${sModelsId}`;
        const value = { sSqlCondition: { sParentId: sId } };
        const checkReturn = (await commonServices.postValueService(token, value, checkUrl)).data;
        /*   获取数据成功就给state赋值,失败则弹出提示   */
        if (checkReturn.code === 1) { /*   成功   */
          const checkData = checkReturn.dataset.rows[0].dataSet;
          this.setState({
            checkData,
            checkFlag: true,
            pageLoading: false,
          });
        } else { /*   失败   */
          message.error(checkReturn.msg);
        }
      } else { /*   不需要重新获取数据   */
        this.setState({
          checkData: obj.checkData,
          checkFlag: true,
          pageLoading: false,
        });
      }
    };

    /**   渲染   */
    render() {
      return (
        <ChildComponent
          {...this.props}
          {...this.state}
          onGetAllData={this.getAllData}
        />
      );
    }
  };
};

